﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;

namespace AcessaDadosBD.Repositorios
{
    public class GuiaOutrasDespesasRepository : IRepository<GuiaOutrasDespesas>
    {
        private IDbCommand Command { get; set; }

        public GuiaOutrasDespesasRepository(IDbCommand cmd)
        {
            this.Command = cmd;
        }

        /// <summary>
        /// Recupera uma Guia de Outras Despesas do banco
        /// </summary>
        /// <param name="id">Id da guia</param>
        /// <returns></returns>
        public GuiaOutrasDespesas GetById(int id)
        {
            try
            {
                Command.Connection.Open();

                Command.CommandText = "SELECT idGuiaOutrasDespesas, local, numeroGuia,idLoteGuia FROM tbGuiaOutrasDespesas WHERE idGuiaOutrasDespesas=" + id;
                Command.CommandType = CommandType.Text;

                var reader = Command.ExecuteReader();

                if (reader.Read())
                {
                    GuiaOutrasDespesas guiaOutrasDespesas = new GuiaOutrasDespesas();

                    guiaOutrasDespesas.ID = int.Parse(reader["idGuiaOutrasDespesas"].ToString());
                    guiaOutrasDespesas.Local = reader["local"].ToString();
                    guiaOutrasDespesas.NumeroGuia = reader["numeroGuia"].ToString();
                    guiaOutrasDespesas.IDLoteGuia = int.Parse(reader["idLoteGuia"].ToString());
                    return guiaOutrasDespesas;
                }
                else
                {
                    throw new Exception("Login não encontrado");
                }
            }
            catch (Exception e)
            {
                throw new Exception("Erro ao executar operação: " + e.Message);
            }
            finally
            {
                Command.Connection.Close();
            }
        }

        /// <summary>
        /// Recupera todas as guias do banco
        /// </summary>
        /// <returns></returns>
        public IQueryable<GuiaOutrasDespesas> GetAll()
        {
            try
            {
                Command.Connection.Open();

                Command.CommandText = "SELECT idGuiaOutrasDespesas, local, numeroGuia,idLoteGuia FROM tbGuiaOutrasDespesas";
                Command.CommandType = CommandType.Text;

                var reader = Command.ExecuteReader();

                List<GuiaOutrasDespesas> list = new List<GuiaOutrasDespesas>();
                while (reader.Read())
                {
                    GuiaOutrasDespesas guiaOutrasDespesas = new GuiaOutrasDespesas();

                    guiaOutrasDespesas.ID = int.Parse(reader["idGuiaOutrasDespesas"].ToString());
                    guiaOutrasDespesas.Local = reader["local"].ToString();
                    guiaOutrasDespesas.NumeroGuia = reader["numeroGuia"].ToString();
                    guiaOutrasDespesas.IDLoteGuia = int.Parse(reader["idLoteGuia"].ToString());

                    list.Add(guiaOutrasDespesas);
                }
                return list.AsQueryable<GuiaOutrasDespesas>();
            }
            catch (Exception e)
            {
                throw new Exception("Erro ao executar operação: " + e.Message);
            }
            finally
            {
                Command.Connection.Close();
            }
        }

        /// <summary>
        /// Insere uma nova guia no banco
        /// </summary>
        /// <param name="entity"></param>
        public int Insert(GuiaOutrasDespesas entity)
        {
            try
            {
                Command.Connection.Open();

                Command.CommandText = "INSERT INTO tbGuiaOutrasDespesas (local, numeroGuia, idLoteGuia) VALUES (" + entity.Local + ",'" + entity.NumeroGuia + "', '" + entity.IDLoteGuia + "')";
                Command.CommandType = CommandType.Text;

                var reader = Command.ExecuteNonQuery();

                Command.CommandText = "SELECT @@IDENTITY";

                return int.Parse(Command.ExecuteScalar().ToString());
            }
            catch (Exception e)
            {
                throw new Exception("Erro ao executar operação: " + e.Message);
            }
            finally
            {
                Command.Connection.Close();
            }
        }

        /// <summary>
        /// Remove uma guia do banco
        /// </summary>
        /// <param name="entity"></param>
        public void Delete(GuiaOutrasDespesas entity)
        {
            try
            {
                Command.Connection.Open();

                Command.CommandText = "DELETE FROM tbGuiaOutrasDespesas WHERE idGuiaOutrasDespesas=" + entity.ID;
                Command.CommandType = CommandType.Text;

                var reader = Command.ExecuteNonQuery();
            }
            catch (Exception e)
            {
                throw new Exception("Erro ao executar operação: " + e.Message);
            }
            finally
            {
                Command.Connection.Close();
            }
        }

        /// <summary>
        /// Atualiza uma guia do banco
        /// </summary>
        /// <param name="entity">Entidade que representa a guia a ser atualizada</param>
        public void Update(GuiaOutrasDespesas entity)
        {
            try
            {
                Command.Connection.Open();

                Command.CommandText = "UPDATE tbGuiaOutrasDespesas SET local='" + entity.Local + "', numeroGuia='" + entity.NumeroGuia + ",'idLoteGuia='"+entity.IDLoteGuia + "' WHERE idLogin=" + entity.ID;
                Command.CommandType = CommandType.Text;

                var reader = Command.ExecuteNonQuery();
            }
            catch (Exception e)
            {
                throw new Exception("Erro ao executar operação: " + e.Message);
            }
            finally
            {
                Command.Connection.Close();
            }
        }
    }
}
